package com.zkc.blog.uilt;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class MyUilt {

	/**
	 * 字符串空判断
	 * @param str
	 * @return
	 */
	public static boolean isNullStr(String str ){
		if(str==null||str.equals(""))
			return true;
		else return false;
	}
	
	
	/**
	 * md5加密
	 * @return
	 */
	public static String md5(String srouce){
		StringBuffer str=new StringBuffer();//存储加密后的hash值
		byte[] mdbyte=null;					//存放md5加密后未转换为hash值的字节
		//16进制的对于数组
		char[] c16={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
		//判断字符是否非空,如果是null抛出异常
		if(isNullStr(srouce)){
			throw new RuntimeException(PubCont.STRNULL);
		}
		
		//加密
		try {
			//获取一个md5加密摘要（核心）
			MessageDigest md = MessageDigest.getInstance("MD5");
			
			//加密获得加密后的字节数组
			mdbyte = md.digest(srouce.getBytes());
			
			//将加密后的字节数组转为16进制的hash值
			for(int i = 0;i < mdbyte.length;i++){
				
				/*1、获取每个字节的低四位值与高四位的10进制值
				 * 低四位：一个字节8位，将原字节跟00001111（15）做与运算可得出，如原字节：10101101 & 00001111=00001101=13
				 * 高四位：将原字节右移四位再跟00001111做与运算可得，如(10101101>>4) & 00001111=00001010=10
				 */
				int lowdate = mdbyte[i] & 15;
				int higdate = (mdbyte[i] >> 4) & 15;
				
				/*
				 * 2、得到的10进制值跟16进制数组对于（相当其下标）得16进制值
				 * 将其存入字符串。 
				 */
				str.append(c16[higdate]).append(c16[lowdate]);
			}
		} catch (NoSuchAlgorithmException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return str.toString();
	}
	
	
}
